home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / include / bf.h.save < prev    next >
Text File  |  1990-09-21  |  6KB  |  194 lines

  1. /*
  2.  * bf.h --
  3.  *
  4.  *    Macros to manipulate bits in a string of bytes, simulating the
  5.  *    effect of bit fields.
  6.  *
  7.  * Copyright 1990 Regents of the University of California
  8.  * Permission to use, copy, modify, and distribute this
  9.  * software and its documentation for any purpose and without
  10.  * fee is hereby granted, provided that the above copyright
  11.  * notice appear in all copies.  The University of California
  12.  * makes no representations about the suitability of this
  13.  * software for any purpose.  It is provided "as is" without
  14.  * express or implied warranty.
  15.  *
  16.  * $Header: /sprite/lib/forms/RCS/proto.h,v 1.5 90/01/12 12:03:25 douglis Exp $ SPRITE (Berkeley)
  17.  */
  18.  
  19. #ifndef _BF
  20. #define _BF
  21.  
  22. #define BfMin(a, b)    ((a) < (b) ? (a) : (b))
  23.  
  24. #define BfMask(bits)   ((1 << (bits)) - 1)
  25.  
  26. #define BfU(ptr)       (sizeof(*(ptr)) * 8)
  27.  
  28. #define BfDx(ptr, x, d)     (((x) == 0) ? (d) & (BfU(ptr) - 1) : 0)
  29.  
  30. #define BfS0(ptr, d, s)     (BfMin(BfU(ptr) - BfDx(ptr, 0, d), s))
  31.  
  32. #define BfSumS0(ptr, d, s)  (BfS0(ptr, d, s))
  33.  
  34. #define BfS1(ptr, d, s)     (BfMin(BfU(ptr) - BfDx(ptr, 1, d), \
  35.                 (s) - BfSumS0(ptr, d, s)))
  36.  
  37. #define BfSumS1(ptr, d, s)  (BfS0(ptr, d, s) + BfS1(ptr, d, s))
  38.  
  39. #define BfS2(ptr, d, s)     (BfMin(BfU(ptr) - BfDx(ptr, 2, d), \
  40.                 (s) - BfSumS1(ptr, d, s)))
  41.  
  42. #define BfSumS2(ptr, d, s)  (BfSumS1(ptr, d, s) + BfS2(ptr, d, s))
  43.  
  44. #ifdef BF_32_BITS
  45.  
  46. #define BfS3(ptr, d, s)     (BfMin(BfU(ptr) - BfDx(ptr, 3, d), \
  47.                 (s) - BfSumS2(ptr, d, s)))
  48.  
  49. #define BfSumS3(ptr, d, s)  (BfSumS2(ptr, d, s) + BfS3(ptr, d, s))
  50.  
  51. #define BfS4(ptr, d, s) (BfMin(BfU(ptr) - BfDx(ptr, 4, d), \
  52.                 (s) - BfSumS3(ptr, d, s)))
  53.  
  54. #define BfSumS4(ptr, d, s)  (BfSumS3(ptr, d, s) + BfS4(ptr, d, s))
  55.  
  56. #define BfSx(ptr, x, d, s)                         \
  57.     (((x) == 0) ? BfS0(ptr, d, s) : (((x) == 1) ? BfS1(ptr, d, s) :     \
  58.     (((x) == 2) ? BfS2(ptr, d, s) : (((x) == 3) ? BfS3(ptr, d, s) :    \
  59.     BfS4(ptr, d, s)))))
  60.  
  61. #define BfSumSx(ptr, x, d, s)                           \
  62.     (((x) == 0) ? BfSumS0(ptr, d, s) : (((x) == 1) ? BfSumS1(ptr, d, s) : \
  63.     (((x) == 2) ? BfSumS2(ptr, d, s) : (((x) == 3) ? BfSumS3(ptr, d, s) : \
  64.     BfSumS4(ptr, d, s)))))
  65.  
  66. #else /* BF_32_BITS */
  67.  
  68. #define BfSx(ptr, x, d, s)                         \
  69.     (((x) == 0) ? BfS0(ptr, d, s) : (((x) == 1) ? BfS1(ptr, d, s) :     \
  70.     BfS2(ptr, d, s)))
  71.  
  72. #define BfSumSx(ptr, x, d, s)                           \
  73.     (((x) == 0) ? BfSumS0(ptr, d, s) : (((x) == 1) ? BfSumS1(ptr, d, s) : \
  74.     BfSumS2(ptr, d, s)))
  75.  
  76. #endif /* BF_32_BITS */
  77.  
  78. #define BfRx(ptr, x, d, s)   ((s) - BfSumSx(ptr, x, d, s))
  79.  
  80. #define BfQx(ptr, x, d, s) \
  81.         (sizeof(*(ptr)) - (BfDx(ptr, x, d) + BfSx(ptr, x, d, s)))
  82.  
  83. #define BfVx(ptr, x, d, s, v)                         \
  84.     ((((v) >> BfRx(ptr, x, d, s)) & BfMask(BfSx(ptr, x, d, s))) <<     \
  85.     BfQx(ptr, x, d, s))
  86.  
  87. #define NetBfIx(ptr, x, d) (((d) / BfU(ptr)) + (x))
  88.  
  89. #define BfZx(ptr, x, d, s) \
  90.     ((ptr)[NetBfIx(ptr, x, d)] & BfVx(ptr, x, d, s, 0xffffffff))
  91.  
  92. #define BfSetx(ptr, x, d, s, v)  {                    \
  93.     if ((v) != BfMask(s)) {                        \
  94.     (ptr)[NetBfIx(ptr, x, d)] &= ~BfVx(ptr, x, d, s, 0xffffffff);     \
  95.     }                                    \
  96.     (ptr)[NetBfIx(ptr, x, d)] |= BfVx(ptr, x, d, s, v);         \
  97. }
  98.  
  99. #define BfTestx(ptr, x, d, s, v) \
  100.     (BfZx(ptr, x, d, s) == BfVx(ptr, x, d, s, v))
  101.  
  102. #ifdef BF_32_BITS
  103.  
  104. #define Bf_Set(ptr, d, s, v)  {                    \
  105.     BfSetx(ptr, 0, d, s, v);                    \
  106.     if (BfRx(ptr, 0, d, s) > 0) {                \
  107.     BfSetx(ptr, 1, d, s, v);                \
  108.     if (BfRx(ptr, 1, d, s) > 0) {                \
  109.         BfSetx(ptr, 2, d, s, v);                \
  110.         if (BfRx(ptr, 2, d, s) > 0) {    k        \
  111.         BfSetx(ptr, 3, d, s, v);            \
  112.         if (BfRx(ptr, 3, d, s) > 0) {            \
  113.             BfSetx(ptr, 4, d, s, v);            \
  114.         }                        \
  115.         }                            \
  116.     }                            \
  117.     }                                \
  118. }
  119.  
  120. #define Bf_Test(ptr, d, s, v)                     \
  121.     ((BfRx(ptr, 0, d, s) <= 0) ?                 \
  122.     (BfTestx(ptr, 0, d, s, v)) :                 \
  123.     ((BfRx(ptr, 1, d, s) <= 0) ?                \
  124.         (BfTestx(ptr, 0, d, s, v) &&            \
  125.         BfTestx(ptr, 1, d, s, v)) :                \
  126.         ((BfRx(ptr, 2, d, s) <= 0) ?            \
  127.         (BfTestx(ptr, 0, d, s, v) &&            \
  128.         BfTestx(ptr, 1, d, s, v) &&            \
  129.         BfTestx(ptr, 2, d, s, v)) :             \
  130.         ((BfRx(ptr, 3, d, s) <= 0) ?            \
  131.             (BfTestx(ptr, 0, d, s, v) &&        \
  132.             BfTestx(ptr, 1, d, s, v) &&            \
  133.             BfTestx(ptr, 2, d, s, v) &&            \
  134.             BfTestx(ptr, 3, d, s, v)) :            \
  135.             (BfTestx(ptr, 0, d, s, v) &&        \
  136.             BfTestx(ptr, 1, d, s, v) &&            \
  137.             BfTestx(ptr, 2, d, s, v) &&            \
  138.             BfTestx(ptr, 3, d, s, v) &&            \
  139.             BfTestx(ptr, 4, d, s, v))))))
  140.  
  141.  
  142. #define Bf_Get(ptr, d, s)                         \
  143.     ((BfRx(ptr, 0, d, s) == 0) ?                     \
  144.     (BfZx(ptr, 0, d, s) >> BfQx(ptr, 0, d, s)) :             \
  145.     ((BfZx(ptr, 0, d, s) << BfRx(ptr, 0, d, s)) |            \
  146.     ((BfRx(ptr, 1, d, s) == 0) ?                       \
  147.         (BfZx(ptr, 1, d, s) >> BfQx(ptr, 1, d, s)) :         \
  148.         ((BfZx(ptr, 1, d, s) << BfRx(ptr, 1, d, s)) |        \
  149.         ((BfRx(ptr, 2, d, s) == 0) ?                   \
  150.         (BfZx(ptr, 2, d, s) >> BfQx(ptr, 2, d, s)) :        \
  151.         ((BfZx(ptr, 2, d, s) << BfRx(ptr, 2, d, s)) |        \
  152.         ((BfRx(ptr, 3, d, s) == 0) ?                \
  153.         (BfZx(ptr, 3, d, s) >> BfQx(ptr, 3, d, s)) :        \
  154.         ((BfZx(ptr, 3, d, s) << BfRx(ptr, 3, d, s)) |        \
  155.         (BfZx(ptr, 4, d, s) >> BfQx(ptr, 4, d, s))))))))))
  156.  
  157. #else /* BF_32_BITS */
  158.  
  159. #define Bf_Set(ptr, d, s, v)  {                    \
  160.     BfSetx(ptr, 0, d, s, v);                    \
  161.     if (BfRx(ptr, 0, d, s) > 0) {                \
  162.     BfSetx(ptr, 1, d, s, v);                \
  163.     if (BfRx(ptr, 1, d, s) > 0) {                \
  164.         BfSetx(ptr, 2, d, s, v);                \
  165.     }                            \
  166.     }                                \
  167. }
  168.  
  169.  
  170. #define Bf_Test(ptr, d, s, v)                     \
  171.     ((BfRx(ptr, 0, d, s) <= 0) ?                 \
  172.     (BfTestx(ptr, 0, d, s, v)) :                 \
  173.     ((BfRx(ptr, 1, d, s) <= 0) ?                \
  174.         (BfTestx(ptr, 0, d, s, v) &&            \
  175.         BfTestx(ptr, 1, d, s, v)) :                \
  176.         (BfTestx(ptr, 0, d, s, v) &&            \
  177.         BfTestx(ptr, 1, d, s, v) &&                \
  178.         BfTestx(ptr, 2, d, s, v))))
  179.  
  180.  
  181. #define Bf_Get(ptr, d, s)                     \
  182.     ((BfRx(ptr, 0, d, s) == 0) ?                 \
  183.     (BfZx(ptr, 0, d, s) >> BfQx(ptr, 0, d, s)) :         \
  184.     ((BfZx(ptr, 0, d, s) << BfRx(ptr, 0, d, s)) |        \
  185.     ((BfRx(ptr, 1, d, s) == 0) ?                   \
  186.         (BfZx(ptr, 1, d, s) >> BfQx(ptr, 1, d, s)) :     \
  187.         ((BfZx(ptr, 1, d, s) << BfRx(ptr, 1, d, s)) |    \
  188.         (BfZx(ptr, 2, d, s) >> BfQx(ptr, 2, d, s))))))
  189.  
  190. #endif /* BF_32_BITS */
  191.  
  192. #endif /* _BF */
  193.  
  194.